package ferp.core.tutorial.beginner;

import ferp.core.card.Card;
import ferp.core.game.Bid;
import ferp.core.tutorial.Scenario;

/**
 * User: igorgok
 * Date: 06/05/2015 11:19
 */
public class Tricking extends Scenario
{
  public static class Lesson1 extends Tricking
  {
    public Lesson1()
    {
      super(new Resource("Заказ игры и розыгрыш", "Declaring and playing contract"));

      deal(0, -1930427760, 285829194, 1644597540, 1024, 1);

      bid(0, 0, Bid.play(Card.Suit.SPADES, 6), Note.top(new Resource("Правый игрок также пасует. 4 старшие карты в 0c и ещё 2 туза гарантируют Вам <b>6</b> взяток. Это достаточно для минимальной заявки 6s.",
                                                                     "The right player passes as well. 4 highest cards in 0c and 2 aces guarantee you <b>6</b> tricks. It's enough for the minimal bid 6s.")));

      bid(0, 1, Bid.pass(), Note.center(new Resource("Игрок слева в этом розыгрыше является <b>первой рукой</b> {first_hand_left}. Он начинает <b>торг</b>.",
                                                     "Player on the left is a <b>first hand</b> {first_hand_left} in this game. He starts the <b>bidding</b>.")));

      bid(0, 2, Bid.pass(), Note.center(new Resource("Левый игрок <b>пасует</b>.",
                                                     "The left player <b>passes</b>.")));

      setOver.bidding(new Resource("Торг завершен.<br>" +
                                   "В верхней части стола открылись 2 карты, называемые <b>прикуп</b>. Они добавятся к Вашим 10-ти картам.<br>" +
                                   "Для этого, нажмите на любое место на экране.",
                                   "Bidding is over.<br>" +
                                   "You can see 2 open cards on the top of the screen. They are called <b>talon</b>." +
                                   "These cards are to be added to the ten cards you already have.<br>" +
                                   "To do that tap the screen."));

      drop(1024, 512, new Resource("Перед началом розыгрыша, у каждого игрока должно быть по 10 карт. В данный момент у Вас их 12, поэтому вы обязаны снести 2.<br>" +
                                   "В Ваших картах 0d - самая слабая масть. Поэтому стоит снести d8 и d9.<br>" +
                                   "Нажмите на отмеченные 2 карты, затем на кнопку <b>Снос</b>.",
                                   "Before the game starts each player should have 10 cards in hand. At the moment you have 12, therefore you must discard 2.<br>" +
                                   "0d is the weakest suit in your hand. Therefore it would be wise to drop d8 and d9.<br>" +
                                   "Tap the 2 marked cards, then the <b>Drop</b> button."));

      contract(0, 0, Bid.play(Card.Suit.CLUBS, 6), Note.top(new Resource("Время <b>объявлять игру</b>. Вы по прежнему можете расчитывать на 6 взяток с козырем 0c.<br>" +
                                                                         "Выберите контракт 6c с помощью отмеченных кнопок.",
                                                                         "Time to <b>declare a contract</b>. You can still count on 6 tricks with 0c as trump.<br>" +
                                                                         "Select 6c contract using the marked buttons.")));

      contract(0, 1, Bid.whist(2), Note.center(new Resource("Согласно правилам, оппоненты решают - играть ли им против Вас в этой раздаче, т.е. <b>вистовать</b> им или <b>пасовать</b>.",
                                                            "According to the rules the opponents have to decide should they play against your in this deal, e.g. <b>to whist</b> or <b>to pass</b>")));

      contract(0, 2, Bid.pass(), Note.center(new Resource("Левый игрок решил <b>вистовать</b>. Это означает, что он обязуется взять не менее <b>4</b>-х взяток (правила виста на 6-ной игре).",
                                                          "The left player decided <b>to whist</b>. This means that he must take no less than <b>4</b> tricks (rules for whisting on game of 6).")));

      setOver.contracting(new Resource("Правый игрок <b>пасует</b>. Так как первый ход от оппонентов, вистующий игрок должен решить <b>открывать</b> ли их карты.",
                                       "The right player <b>passes</b>. Since the opponents start, the whister has to decide whether to <b>reveal</b> their cards."));

      stand = false;

      trick(0, -1068003059, new Resource("У Вас нет 0d, поэтому Вы обязаны класть <b>козырь</b> (0c). На это был расчёт оппонентов, пытающихся <b>угадать</b> Ваш <b>снос</b>.<br>" +
                                         "Играйте cВ.",
                                         "You have no 0d, therefore you must play <b>trump</b> (0c). The opponents hoped for that trying to <b>guess</b> your <b>drop</b>.<br>" +
                                         "Play cJ."),
                            new Resource("Оппоненты решили играть против Вас <b>в открытую</b>.",
                                         "The opponents have decided to play against you on <b>open</b> cards."),
                            new Resource("Левый игрок зашёл в 0d. По правилам, правый игрок также обязан класть 0d.",
                                         "The left player opens with 0d. By the rules, the right player must play 0d as well."),
                            new Resource("Ваш козырь - самая сильная карта этого хода, поэтому Вы забираете взятку. В следующем раунде, Ваш ход - первый.",
                                         "Your trump is the highest card in this round, thus you take the trick. You start the next round."));

      trick(1, -1072674422, new Resource("Вам осталось взять 5 взяток для выполнения контракта. 3 старших козыря и 2 туза - как раз 5. Начинаем с козырей: cТ.",
                                         "You have 5 tricks left to take for fulfilling the contract. 3 highest trumps and 2 aces should do the job. Let's start with the trumps: cA."),
                            new Resource("Оппоненты обязаны класть козырей.", "The opponents must play trumps."),
                            null,
                            new Resource("Это Ваша вторая взятка.", "This is your second trick."));

      trick(2, -1072739189, new Resource("Продолжаем козырями: cК.", "Continue with the trumps: cK."),
                            null,
                            null,
                            new Resource("У оппонентов больше не осталось козырей.", "The opponents are out of trumps now."));

      trick(3, -1072802667, new Resource("Кладите Ваш последний козырь: cД.", "Play your last trump: cQ"),
                            new Resource("Так как у левого игрока больше нет козырей, он может играть <b>любой</b> картой.",
                                         "Since the left player has no trumps, he can play <b>any</b> card."),
                            new Resource("То же самое выполняется и для правого игрока.", "Same holds for the right player."));

      trick(4, -1071621477, new Resource("Осталось взять 2 взятки на 2-х тузов. Играйте hТ.",
                                         "2 more tricks to take with 2 aces. Play hA."),
                            null,
                            null);

      trick(5, -1073200766, new Resource("Теперь sТ.",
                                         "Now sA."),
                            null,
                            null);

      trick(6, -1072079714, new Resource("Больше Ваших взяток нет. Оставшиеся 4 забирают оппоненты. Просто ходите <b>помечеными</b> картами.",
                                         "You can not take any more tricks. The opponents take remaining 4. Just play the <b>marked</b> cards."),
                            null,
                            null);

      trick(7, -1063779498);
      trick(8, -1064893371);
      trick(9, -1064952481);

      setOver.moving(new Resource("Вы взяли объявленые <b>6</b> взяток, тем самым выполнив контракт. <b>Вистующие</b> в сумме взяли оставшиеся <b>4</b> взятки, также выполнив требуемые условия виста.",
                                  "You have taken the declared <b>6</b> tricks, fulfilling the contract. The <b>whisters</b> won the remaining <b>4</b> tricks fulfilling whist requirements."));

      scoring(new Resource("За успешно сыгранную игру, объявивший её игрок получает бонус в <b>пулю</b>, равный <b>стоимости игры</b> (С). Вистующие пишут на игрока <b>висты</b>: кол-во их взяток × С.<br>" +
                           "Для шестерной: С=2.",
                           "For successfully played contact the declared gets a bonus in <b>pool</b> area equals to the <b>game cost</b> (C). The whisters write whists on the declarer: number of their tricks × C.<br>" +
                           "For the game of six: C=2."));
    }
  }

  public static class Lesson2 extends Tricking
  {
    public Lesson2()
    {
      super(new Resource("Вист на контракте", "Whisting on contract"));

      deal(2, 1049690272, -1054543616, 4853337, 4, 2);

      bid(0, 0, Bid.play(Card.Suit.SPADES, 6), Note.top(new Resource("У Вас на руке 5 взяток с козырем 0s: 3 в 0s и 2 туза. Можно рискнуть, надеясь на прикуп и сделать заявку на игру.<br>" +
                                                                     "Нажмите кнопку 6s",
                                                                     "You have 5 trick in hand with 0s as trump: 3 in 0s and 2 aces. Hoping for the good talon card you can risk and bid.<br>" +
                                                                     "Tap the 6s button.")));

      bid(0, 1, Bid.play(Card.Suit.CLUBS, 6), null);

      bid(0, 2, Bid.pass(), Note.center(new Resource("Левый игрок сделал заявку 6c, тем самым перебив Вашу.",
                                                     "The left player has overbid you with 6c")));

      bid(1, 0, Bid.pass(), Note.top(new Resource("Правый игрок решил не участвовать в торге.<br>" +
                                                  "Следующая ставка в 0s - <b>7</b>. До неё Вам не хватает 2-х взяток. Риск слишком высок - нажмите кнопку <b>Пас</b>",
                                                  "The right player decided to <b>pass</b>.<br>" +
                                                  "Next bid in 0s is <b>7</b>. With your 5 it's 2 more to go. The risk is too high - tap the <b>Pass</b> button.")));

      setOver.bidding(new Resource("Торг завершён. Левый игрок заберёт открывшийся вверху экрана прикуп, так как он выиграл торг.",
                                   "Bidding has ended. The left player will take the talon cards revealed at the top of the screen as he won the bidding."));

      drop(4, 2, new Resource("У левого игрока сейчас 12 карт. Он должен снести 2 и, затем, объявить окончательный <b>контракт</b>.",
                              "The left player now has 12 cards. He has to drop 2 and then declare the final <b>contract</b>."));

      contract(0, 0, Bid.whist(0), Note.top(new Resource("Правый игрок <b>пасует</b>.<br>" +
                                                         "Вист на семерной обязывает вистующих взять <b>2</b> взятки в сумме. В 0h и 0c у Вас подходящие для вистования карты. Нажмите кнопку <b>Вист</b>.",
                                                         "The right player <b>passes</b>.<br>" +
                                                         "Whisting on the game of 7 requires the whisters to take <b>2</b> tricks in total. You have good cards in 0h and 0c for whisting. Tap the <b>Whist</b> button.")));

      contract(0, 1, Bid.play(Card.Suit.DIAMONDS, 7), null);

      contract(0, 2, Bid.pass(), Note.center(new Resource("Левый игрок объявил игру 7d, то есть обязался взять <b>7</b> взяток с козырем 0d.",
                                                          "The left player has declared the game of 7d, i.e. he is committed to take <b>7</b> tricks with 0d as a trump.")));

      stand = false;

      gameType(new Resource("Как единственный вистущий, Вы решаете играть ли Вам с открытыми (<b>лёжа</b>) или закрытыми (<b>стоя</b>) картами против объявившего игру игрока. Нажмите кнопку <b>Лёжа</b>.",
                            "As the only whister you decide whether to play with revealed (<b>open</b>) or closed cards (<b>blind</b>) against the declarer. Tap the <b>Open</b> button."));

      trick(0, -1073593966, Note.top(new Resource("У играющего 7 взяток: 5 козырей и К,Т в 0s. Но в случае, если он снёс 2 0h, можно попробовать не дать сыграть одной из старших 0s. Играйте s8.",
                                                  "The declarer has 7 tricks: 5 trumps and K,A in 0s. But in case he dropped 2 0h, we can try to block one of the highest 0s. Play s8.")),
                            null,
                            Note.bottom(new Resource("Вы ходите за пасующего партнера и, так как у него нет 0s, обязаны класть <b>козырь</b>: d8.",
                                                     "You make moves for the passed partner and since he has no 0s you must play <b>trump</b>: d8.")),
                            Note.top(new Resource("Старшая карта в этом ходе принадлежит правому игроку, поэтому он забирает взятку и начнёт следующий раунд.",
                                                  "The right player has highest card in this round, therefore he takes the trick and starts the next round.")));

      trick(1, -1064693685, new Resource("Надеясь на то, что играющий <b>не снёс</b> 0c, забираем эту взятку <b>тузом</b>.",
                                         "Hoping that the declarer has <b>not dropped</b> 0c, play <b>ace</b> to take this trick."),
                            null,
                            new Resource("Сейчас нужно передать ход на свою руку, чтобы, затем, продолжить заходы в 0s. Играйте c8.",
                                         "Now we have to make ourselves start the next round in order to keep playing 0s. Play c8."),
                            new Resource("Наш расчёт на 0c оказался верным. Вы начинаете следующий раунд.",
                                         "Our guess for declarer to keep the 0c turned out right. You start the next round."));

      trick(2, -1073526893, Note.top(new Resource("Ещё один ход в 0s: s9.",
                                                  "One more move with 0s: s9.")),
                            null,
                            Note.bottom(new Resource("Левый игрок был обязан класть одну из старших 0s, которую мы и заберем козырем: играйте d9.",
                                                     "The left player had to play one of the highest 0s, which we are going to take with a trump: play d9.")),
                            Note.top(new Resource("Как и планировалось, одна из старших 0s играющего не сыграла.",
                                                  "One of the highest declarer's 0s was blocked as planned.")));

      trick(3, -1064367794, new Resource("Играйте c7.", "Play c7."),
                            null,
                            new Resource("Продолжаем играть 0c. Если играющий её не снёс, у него осталась <b>дама</b>, которую можно забрать <b>королём</b>.",
                                         "Continue playing 0c. In case the declarer has not dropped them he still has <b>queen</b>, which we can take with our <b>king</b>."),
                            new Resource("Теперь ясно, что играющий снёс 0h.", "Now it is clear that the declarer dropped 0h."));

      trick(4, -1064563375, null,
                            null,
                            new Resource("Вы и партнёр взяли в сумме 4 взятки, что означает, что играющий недобирает одну до объявленного контракта.<br>" +
                                         "Больше Ваших взяток нет. Далее играйте отмеченными картами за себя и партнёра.",
                                         "You and your partner took 4 tricks in total, meaning that the declarer is going to fail his contract by one trick.<br>" +
                                         "There are no more tricks you can take. Play the marked cards for you and your partner."));

      trick(5, -1068133346);
      trick(6, -1068066528);
      trick(7, -1068000252);
      trick(8, -1067934459);
      trick(9, -1068982522);

      setOver.moving(new Resource("Играющий не добрал одну взятку до 7-и заявленных в контракте.",
                                  "The declarer took 6 tricks out of 7 stated in the contract."));

      scoring(new Resource("За невыполнение контракта играющему записывается в гору кол-во недобранных взяток (Н) × стоимость игры (С).<br>" +
                           "Висты на играющего от вистующего: (кол-во взяток последнего + Н) × С, от пасующего: Н × С.<br>" +
                           "Где Н=1, а С=4 для семерной",
                           "For failing the contract the declarer receives number of tricks missing (M) × game cost (C).<br>" +
                           "Whists to the declarer from the whister: (number of tricks taken by the latter + M) × C, from the passer: M × C.<br>" +
                           "Where M=1, C=4 for the game of 7."));
    }
  }

  protected Tricking(Resource title)
  {
    super(title);

    introduction.add(new Resource("Задача объявившего <b>контракт</b> игрока выполнить заявленное. Минимальный контракт - <b>6</b> взяток с <b>козырем</b> в одной из мастей, либо <b>без козыря</b>. Максимальный - 10 взяток.<br>" +
                                  "Во время <b>торгов</b>, игроки, по очереди, делают <b>заявки</b>. Заявка, с большим по весу контрактом, перебивает заявку с меньшим.",
                                  "Declaring player's goal is to fulfill the contract. The lowest contract is taking <b>6</b> tricks either with or without a <b>trump</b>. The highest one is 10 tricks.<br>" +
                                  "During the <b>bidding</b> rounds, players make <b>bids</b> turn by turn. A bid with higher contract cost beats the lower one."));
    introduction.add(new Resource("Чем больше взяток обязуется взять игрок, тем выше вес заявки. Также учитывается старшинство мастей: пика 0s, трефа 0c, бубна 0d, черва 0h.<br>" +
                                  "Пример: вес заявки 6c выше, чем 6s. Но 7s выше, чем 6c.",
                                  "Bid cost is defined by the number of tricks. Also, suit order matters: spades 0s, clubs 0c, diamonds 0d, hearts 0h.<br>" +
                                  "Example: 6c is higher than 6s. But, 7s is higher than 6c."));
    introduction.add(new Resource("Если карты игрока не позволяют ему перебить текущую заявку - он <b>пасует</b>, тем самым выбывая из борьбы за контракт.",
                                  "If player's cards would not allow to raise the current bid it is advised to <b>pass</b>, skipping the further bidding."));
    introduction.add(new Resource("Победитель торгов забирает 2 карты прикупа, видимые всеми игроками и сбрасывает 2 любые карты, не показывая их. Затем, он объявляет контракт, который обязан быть <b>не ниже</b> последней заявки.",
                                  "Bidding round winner takes 2 talon cards visible to all players, discards any 2 cards that are not shown to the others. Then he declares a contract, which has to be <b>not lower</b> than the last bid."));
    introduction.add(new Resource("После объявления контракта, оппоненты решают играть ли им против объявившего, то есть <b>вистовать</b>. Вист - это обязательство со стороны оппонентов взять в сумме некое количество взяток, в зависимости от контракта: 6 -> 4; 7 -> 2; 8,9 -> 1; 10 рассматривается отдельно.<br>" +
                                  "Если хотя бы один из оппонентов <b>вистует</b> - начинается <b>розыгрыш</b>, в котором задача игроков набрать заявленное число взяток.",
                                  "After contract declaration opponents decide whether they are going to play against the declarer, that is <b>to whist</b>. Whist is an opponents' commitment to take in total certain number of tricks, depending on the contract: 6 -> 4; 7 -> 2; 8,9 -> 1; 10 is treated differently.<br>" +
                                  "If at least one opponent whists a trick taking game starts, where players try to win the number of tricks declared beforehand."));
    introduction.add(new Resource("В каждом раунде розыгрыша, игроки, по часовой стрелке, делают ход одной картой. Первая карта в раунде задаёт масть. Следующие две должны быть картой той же масти, козырем (если эта масть отсутствует) или любой другой картой (если нет козырей).",
                                  "In each round of the trick taking game players put one card each, clockwise. The first card in round sets the suit. Next two cards hav to be either of the same suit, trump (if the suit is absent) or any other card (no trumps)."));
    introduction.add(new Resource("Розыгрыш заканчивается, когда все карты сыграны, либо досрочно по соглашению всех игроков",
                                  "The trick taking game ends when all the cards played or players agreed to end it early."));
  }
}
